﻿Imports System.Data.SqlClient
Imports System.IO
Imports Sendkey = System.Windows.Forms.SendKeys
'Imports System.Threading

Public Class FrmDelitos

#Region "Variables"

    Private cDelitos As New clsDelitos
    Private cGeneral As New clsGeneral
    Private cMateriaTipoAsunto As New clsMateriaTipoAsunto

    Dim dtDelitos As New DataTable()
    Dim dtMateriaTipoAsunto As New DataTable()
    Dim dtMateria As New DataTable()
    Dim dtTipo As New DataTable()
    Dim dtAsunto As New DataTable()
    Dim NuevaFila As DataRow
    'Dim NuevaDataRowView As DataRowView

    Dim li_Respuesta As Int16
    Dim Materia_Aux As Integer
    Dim Tipo_Aux As Integer

#End Region


#Region "Eventos"


    Private Sub FrmDelitos_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        gs_Pantalla = Me.Name
        ' carga valores para Auditoría
        cMateriaTipoAsunto.Aplicacion = gs_Sistema_Nombre
        cMateriaTipoAsunto.Pantalla = gs_Pantalla
        cMateriaTipoAsunto.Usuario = gs_Usuario
        cMateriaTipoAsunto.Maquina = gs_Maquina

        dtMateriaTipoAsunto.Clear()
        dtMateriaTipoAsunto = cMateriaTipoAsunto.ObtenerMateriaTipoAsunto("Numerico")
        dtMateria = cMateriaTipoAsunto.Filtrar_Materia(dtMateriaTipoAsunto)
        'Cmb_Materia.DataSource = dtMateria
        'Cmb_Materia.ValueMember = dtMateria.Columns("Materia").ToString
        'Cmb_Materia.DisplayMember = dtMateria.Columns("Nombre").ToString
        Cmb_Materia.DisplayMember = "Nombre"
        Cmb_Materia.ValueMember = "Materia"
        Cmb_Materia.DataSource = dtMateria
        ' forzar la selección del primer elemento del  Cmb_Materia
        Sendkey.Send("{DOWN}")
        Sendkey.Send("{UP}")
        ' forzar la selección del primer elemento del  Cmb_Tipo
        Sendkey.Send("{TAB}")
        Sendkey.Send("{DOWN}")
        Sendkey.Send("{UP}")
        ' regresa el foco a Cmb_Materia con SHIT + TAB
        Sendkey.Send("+{TAB}")

        dtDelitos.Clear()
        dtDelitos = cDelitos.ObtenerDelitos("Numerico")
        dtDelitos = cGeneral.DataTable_Filtrar_Ordenar(dtDelitos, "MateriaTipoAsunto <> 0", "")
        BindingContext(dtDelitos).Position = 0
        Application.DoEvents()
        If dtDelitos.Rows.Count > 0 Then
            Despliega()
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Nuevo_Click(sender As Object, e As EventArgs) Handles Nuevo.Click
        Limpiar()
    End Sub

    Private Sub Guardar_Click(sender As Object, e As EventArgs) Handles Guardar.Click
        If Txt_Descripcion.Text.Trim = "" Then
            MessageBox.Show("Error - Descripcion no puede quedar vacía")
            Txt_Descripcion.Focus()
        Else
            ' carga valores del objeto
            If Txt_Codigo.Text.Trim = "" Then
                cDelitos.Codigo = -1  ' para facilitar posicionamiento en DataTable luego de Incluir en cDelitos.Guardar()
            Else
                cDelitos.Codigo = CType(Txt_Codigo.Text, Integer)
            End If
            cDelitos.Nombre = Txt_Descripcion.Text.Trim
            ' carga valores para Auditoría
            cDelitos.Aplicacion = gs_Sistema_Nombre
            cDelitos.Pantalla = gs_Pantalla
            cDelitos.Usuario = gs_Usuario
            cDelitos.Maquina = gs_Maquina
            cDelitos.Guardar()    ' cDelitos.EstadoGuardar contiene el Id insertado o modificado
            If cDelitos.EstadoGuardar = -1 Then   ' -1 = Error
                ' cDelitos.Guardar() despliega el mensaje de error
            Else
                ' Determina si los valores a almacenar ya existen o no
                If cDelitos.Codigo = -1 Then      ' -1 = Incluir
                    cDelitos.Codigo = cDelitos.EstadoGuardar
                    dtDelitos.Clear()
                    dtDelitos = cDelitos.ObtenerDelitos("Numerico")
                    ' el último es el que se acaba de ingresar así que lo posiciono en el DataTable
                    BindingContext(dtDelitos).Position = BindingContext(dtDelitos).Count - 1
                    Despliega()
                Else
                    ' modifica los datos actuales del DataTable
                    NuevaFila = dtDelitos.Select("Delito=" & cDelitos.Codigo)(0)
                    NuevaFila.Item("Delito") = cDelitos.Codigo
                    NuevaFila.Item("Nombre") = cDelitos.Nombre
                    ' NO hace falta refrescar el formulario con Despliega()
                End If
            End If
        End If
    End Sub

    Private Sub Buscar_Click(sender As Object, e As EventArgs) Handles Buscar.Click
        FrmConsulta.Tag = "Delitos"
        FrmConsulta.dt = dtDelitos
        FrmConsulta.ShowDialog()
        Application.DoEvents()
        If gi_Codigo_1 <> -1 Then ' posiciona el registro seleccionado
            For Fila As Integer = 0 To dtDelitos.Rows.Count - 1
                If dtDelitos.Rows(Fila).Item(0) = gi_Codigo_1 _
                    And dtDelitos.Rows(Fila).Item(1) = gi_Codigo_2 Then
                    BindingContext(dtDelitos).Position = Fila
                    Exit For
                End If
            Next
            Despliega()
        End If
    End Sub

    Private Sub Imprimir_Click(sender As Object, e As EventArgs) Handles Imprimir.Click
        'Dim dt_RPT As New DataTable("Resultados")
        'Dim NuevaFila As DataRow
        'Dim CrReport As New CrystalDecisions.CrystalReports.Engine.ReportDocument

        If dtDelitos.Rows.Count > 0 Then
            Try
                '    dt_RPT.Columns.Add("Codigo")
                '    dt_RPT.Columns.Add("Descripcion")
                '    dt_RPT.Columns.Add("Titulo_Reporte")
                '    For Fila As Integer = 0 To ds.Tables("Resultados").Rows.Count - 1
                '        NuevaFila = dt_RPT.NewRow()
                '        NuevaFila("Codigo") = ds.Tables("Resultados").Rows(Fila).Item("ID_Contexto")
                '        NuevaFila("Descripcion") = ds.Tables("Resultados").Rows(Fila).Item("Nom_Contexto")
                '        NuevaFila("Titulo_Reporte") = "Reporte de Contextos"
                '        dt_RPT.Rows.Add(NuevaFila)
                '    Next

                '    CrReport = New CrystalDecisions.CrystalReports.Engine.ReportDocument()

                '    CrReport.Load(gs_RutaReportes & "RptCatalogos.rpt")

                '    CrReport.SetDataSource(dt_RPT)
                '    Frm_RPT_Visor.CrystalReportViewer1.ReportSource = CrReport
                '    Frm_RPT_Visor.Show()

            Catch ex As Exception
                MessageBox.Show(ex.Message)
            End Try
        Else
            MessageBox.Show("No hay datos para imprimir")
        End If
    End Sub

    Private Sub Excel_Click(sender As Object, e As EventArgs) Handles Excel.Click
        If dtDelitos.Rows.Count > 0 Then
            cGeneral.DataTable_a_Excel(dtDelitos, BarraProgreso)
        Else
            MessageBox.Show("No hay datos para exportar")
        End If
    End Sub

    ' Cada formulario tiene un objeto BindingContext que mantiene el rastro de todos los recursos 
    ' de datos asociados con la forma. 
    ' Para referirse a una tabla utilice:
    '       BindingContext(nombre_DataTable)
    '
    ' Para referirse a una tabla dentro del Dataset utilice:
    '       BindingContext(nombre_Dataset, "NombreTabla")
    '
    ' El objeto BindingContext tiene una propiedad Position que indica el registro actual 
    ' y una propiedad Count que indica el Total de registros en el Dataset. El primer registro tiene 
    ' la posición 0, por lo que el último registro tiene la posición Count - 1. 

    Private Sub Primero_Click(sender As Object, e As EventArgs) Handles Primero.Click
        If BindingContext(dtDelitos).Count > 0 Then
            BindingContext(dtDelitos).Position = 0
            Despliega()
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Anterior_Click(sender As Object, e As EventArgs) Handles Anterior.Click
        If BindingContext(dtDelitos).Count > 0 Then
            If BindingContext(dtDelitos).Position > 0 Then
                BindingContext(dtDelitos).Position -= 1
                Despliega()
            End If
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Siguiente_Click(sender As Object, e As EventArgs) Handles Siguiente.Click
        If BindingContext(dtDelitos).Count > 0 Then
            If BindingContext(dtDelitos).Position < BindingContext(dtDelitos).Count - 1 Then
                BindingContext(dtDelitos).Position += 1
                Despliega()
            End If
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Ultimo_Click(sender As Object, e As EventArgs) Handles Ultimo.Click
        If BindingContext(dtDelitos).Count > 0 Then
            BindingContext(dtDelitos).Position = BindingContext(dtDelitos).Count - 1
            Despliega()
        Else
            Limpiar()
        End If
    End Sub

    Private Sub Borrar_Click(sender As Object, e As EventArgs) Handles Borrar.Click
        If Txt_Codigo.Text.Trim = "" Then
            MessageBox.Show("Debe haber definido un código para poder borrarlo.")
            Txt_Codigo.Focus()
        Else
            li_Respuesta = MessageBox.Show("¿Desea BORRAR el registro de Delito = " & Txt_Codigo.Text & "?", "", MessageBoxButtons.YesNo)
            If li_Respuesta = vbYes Then
                ' carga valores del objeto
                cDelitos.Codigo = CType(Txt_Codigo.Text, Integer)
                ' carga valores para Auditoría
                cDelitos.Aplicacion = gs_Sistema_Nombre
                cDelitos.Pantalla = gs_Pantalla
                cDelitos.Usuario = gs_Usuario
                cDelitos.Maquina = gs_Maquina
                cDelitos.Borrar()    ' cDelitos.EstadoGuardar contiene el Id insertado o modificado
                If cDelitos.EstadoGuardar = -1 Then   ' -1 = Error
                    ' cDelitos.Borrar() despliega el mensaje de error
                Else
                    dtDelitos.Rows.RemoveAt(BindingContext(dtDelitos).Position)
                    If dtDelitos.Rows.Count > 0 Then
                        ' se posiciona en el último registro
                        BindingContext(dtDelitos).Position = BindingContext(dtDelitos).Count - 1
                        Despliega()
                    Else
                        Limpiar()
                    End If
                End If
            End If
        End If
    End Sub

    Private Sub Cmb_Materia_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Cmb_Materia.SelectedIndexChanged
        Recargar_Cmb_Tipo()
    End Sub

    Private Sub Cmb_Materia_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles Cmb_Materia.SelectionChangeCommitted
        Recargar_Cmb_Tipo()
        Recargar_Cmb_Asunto()
    End Sub

    Private Sub Cmb_Tipo_SelectedIndexChanged(sender As Object, e As EventArgs) Handles Cmb_Tipo.SelectedIndexChanged
        If Cmb_Tipo.Tag = "" Then   ' cuando el usuario selecciona un nuevo valor
            Recargar_Cmb_Asunto()
        End If
    End Sub

    Private Sub Cmb_Tipo_SelectionChangeCommitted(sender As Object, e As EventArgs) Handles Cmb_Tipo.SelectionChangeCommitted
        Recargar_Cmb_Asunto()
    End Sub

    Private Sub Txt_Codigo_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txt_Codigo.KeyPress
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("0123456789", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use dígitos")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Codigo_Leave(sender As Object, e As EventArgs) Handles Txt_Codigo.Leave
        If Trim(Txt_Codigo.Text) <> "" Then
            Dim li_Posicion As Integer = -1

            cDelitos.Codigo = CType(Txt_Codigo.Text, Integer)
            For i As Integer = 0 To dtDelitos.Rows.Count - 1
                If dtDelitos.Rows(i).Item("Delito") = cDelitos.Codigo Then
                    li_Posicion = i
                    Exit For
                End If
            Next
            If li_Posicion = -1 Then
                MessageBox.Show("Delito no registrada")
                Limpiar()
            Else
                BindingContext(dtDelitos).Position = li_Posicion
                Despliega()
            End If
        End If
    End Sub

    Private Sub Txt_Descripcion_KeyPress(sender As Object, e As KeyPressEventArgs) Handles Txt_Descripcion.KeyPress
        If Asc(e.KeyChar) = Keys.Return Then
            Sendkey.Send("{tab}")
        ElseIf Asc(e.KeyChar) <> 8 Then
            If InStr("ABCDEFGHIJKLMNOPQRSTUVWXYZ ", Char.ToUpper(e.KeyChar)) = 0 Then
                MessageBox.Show("Caracter inválido, use letras")
                e.Handled = True
            End If
        End If
    End Sub

    Private Sub Txt_Descripcion_Leave(sender As Object, e As EventArgs) Handles Txt_Descripcion.Leave
        'Txt_Descripcion.Text = Txt_Descripcion.Text.ToUpper
    End Sub

    Private Sub Txt_Descripcion_Validating(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles Txt_Descripcion.Validating
        If Txt_Descripcion.Text.Trim = "" Then
            MessageBox.Show("Error - Descripcion no puede quedar vacía")
            e.Cancel = True
        End If
    End Sub

    Private Sub BarraProgreso_VisibleChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles BarraProgreso.VisibleChanged
        Lbl_Progreso.Visible = BarraProgreso.Visible
        Application.DoEvents()
    End Sub

#End Region


#Region "Metodos"

    Sub Despliega()
        NuevaFila = dtDelitos.Rows(BindingContext(dtDelitos).Position)

        cMateriaTipoAsunto.Codigo = NuevaFila.Item("MateriaTipoAsunto")
        cMateriaTipoAsunto.Fragmentar_MateriaTipoAsunto()
        Cmb_Materia.SelectedValue = cMateriaTipoAsunto.Materia
        ' Cmb_Tipo se recarga en evento Cmb_Materia_Click
        Cmb_Tipo.SelectedValue = cMateriaTipoAsunto.Tipo
        ' Cmb_Asunto se recarga en evento Cmb_Tipo_Click
        Cmb_Asunto.SelectedValue = cMateriaTipoAsunto.Asunto


        cDelitos.MateriaTipoAsunto = NuevaFila.Item("MateriaTipoAsunto")
        Txt_Codigo.Text = NuevaFila.Item("Delito")
        Txt_Descripcion.Text = NuevaFila.Item("Nombre")
    End Sub

    Sub Limpiar()
        Cmb_Materia.SelectedIndex = 0
        Cmb_Tipo.SelectedIndex = 1
        Cmb_Tipo.SelectedIndex = 0
        'Application.DoEvents()
        ' Cmb_Tipo y Cmb_Asunto se recargan y posicionan en evento Cmb_Materia_Click
        Txt_Codigo.Text = ""
        Txt_Descripcion.Text = ""
        MessageBox.Show("Seleccione la Materia/Tipo/Asunto de interés y luego digite la descripción correspondiente")
        Cmb_Materia.Focus()
    End Sub

    Sub Recargar_Cmb_Tipo()
        Materia_Aux = Cmb_Materia.SelectedValue
        dtTipo = cMateriaTipoAsunto.Filtrar_Tipo(dtMateriaTipoAsunto, Materia_Aux)
        Cmb_Tipo.Tag = "cargando"       ' para NO disparar Cmb_Tipo_SelectedIndexChanged
        Cmb_Tipo.DataSource = Nothing
        'Cmb_Tipo.DataSource = dtTipo
        'Cmb_Tipo.ValueMember = dtTipo.Columns("Tipo").ToString
        'Cmb_Tipo.DisplayMember = dtTipo.Columns("Nombre").ToString
        Cmb_Tipo.DisplayMember = "Nombre"
        Cmb_Tipo.ValueMember = "Tipo"
        Cmb_Tipo.DataSource = dtTipo
        Cmb_Tipo.Tag = ""
    End Sub

    Sub Recargar_Cmb_Asunto()
        Tipo_Aux = Cmb_Tipo.SelectedValue
        dtAsunto = cMateriaTipoAsunto.Filtrar_Asunto(dtMateriaTipoAsunto, Materia_Aux, Tipo_Aux)
        Cmb_Asunto.DataSource = Nothing
        'Cmb_Asunto.DataSource = dtAsunto
        'Cmb_Asunto.ValueMember = dtAsunto.Columns("Asunto").ToString
        'Cmb_Asunto.DisplayMember = dtAsunto.Columns("Nombre").ToString
        Cmb_Asunto.DisplayMember = "Nombre"
        Cmb_Asunto.ValueMember = "Asunto"
        Cmb_Asunto.DataSource = dtAsunto
    End Sub

#End Region

End Class